BITS 16
global start
extern GDT_DESC
extern IDT_DESC
extern idtFill

jmp start

%include "paging.asm"
%include "a20.asm"

start:	
	call	disable_A20
	call	check_A20
	call 	enable_A20
	call	check_A20

	cli ;deshabilitar interrupciones
	
	lgdt 	[GDT_DESC]
	
	;seteamos el bit PE del registro cr0
	mov 	eax, cr0
	or  	eax, 0x1
	mov 	cr0, eax
	
	jmp 0x08:protegido

BITS 32
protegido:
	mov 	ax, 0x10
	mov 	ds, ax		;acomodo el segmento de datos antes de hacer lio
	mov 	es, ax		;acomodo el segmento de datos antes de hacer lio
	mov 	fs, ax		;acomodo el segmento de datos antes de hacer lio
	mov 	gs, ax		;acomodo el segmento de datos antes de hacer lio
	mov	ss, ax		;acomodo el segmento de pila antes de usarla

	call idtFill
	
	;habilito paginacion
	call page_init			;esto me inicializa el directorio

	mov eax, page_dir		;cargo la direccion del directorio en cr3
	mov cr3, eax

	mov eax, cr0				
	or  eax, 0x80000000		;habilito paginacion
	mov cr0, eax
		
	; Inicializacion PIC1
	mov al, 0x11		; ICW1: IRQs activas por flanco, Modo cascada, ICW4 Si.
	out 0x20, al
	mov al, 0x20 		; ICW2: INT base para el PIC1 Tipo 8. !!! 0x20 decia 8
	out 0x21, al
	mov al, 0x04		; ICW3: PIC1 Master, tiene un Slave conectado a IRQ2
	out 0x21 ,al
	mov al, 0x01		; ICW4: Modo No Buffered, Fin de Interrupcion Normal
	out 0x21, al		; Deshabilitamos las Interrupciones del PIC1
	mov al, 0xFF		; OCW1: Set o Clear el IMR
	out 0x21, al

	; Inicializacion PIC2
	mov al, 0x11		; ICW1: IRQs activas por flanco, Modo cascada, ICW4 Si.
	out 0xA0, al
	mov al, 0x28		; ICW2: INT base para el PIC1 Tipo 070h. !!! 0x28 decia 0x70
	out 0xA1, al
	mov al, 0x02		; ICW3: PIC2 Slave, IRQ2 es la linea que envia al Master
	out 0xA1, al
	mov al, 0x01		; ICW4: Modo No Buffered, Fin de Interrupcion Normal
	out 0xA1, al
	
	lidt [IDT_DESC]

	mov al,0x00
	out 0x21, al

	mov al,0xFF
	out 0xA1, al

	sti
	
	redscreen:
		mov 	ax, 0x18
		mov	es, ax
		mov 	ecx, (25 * 80) << 1
		mov 	ax, 0x4000
		xor 	edi, edi
		.ciclorojo:
			stosw
			loop 	.ciclorojo
	
	jmp $
	
;	.esperar:
;		in al, 0x60
;		cmp al, 0
;		jl .esperar

;	mov 	eax, cr0
;	and  	eax, 0xFFFE
;	mov 	cr0, eax
;
;
;	bluescreen:
;		mov 	ax, 0xB800
;		mov	es, ax
;		mov 	cx, 25 * 80
;		mov 	ax, 0x1000
;		xor 	di, di
;		.cicloazul:
;			stosw
;			loop 	.cicloazul

jmp $
